"use strict";
{
    // 软件工程中，我们不仅要创建一致的定义良好的API，同时也要考虑可重用性。 组件不仅能够支持当前的数据类型，同时也能支持未来的数据类型，这在创建大型系统时为你提供了十分灵活的功能。
    // 在像C#和Java这样的语言中，可以使用泛型来创建可重用的组件，一个组件可以支持多种类型的数据。 这样用户就可以以自己的数据类型来使用组件。
    {
        // 不用泛型
        function identity(arg) {
            return arg;
        }
    }
    {
        // 使用泛型
        function identity(arg) {
            return arg;
        }
        // let output = identity<string>("myString");  // type of output will be 'string'
        // 常用 类型推论
        let output = identity("myString"); // type of output will be 'string'
    }
    {
        // 多个类型参数
        function swap(tuple) {
            return [tuple[1], tuple[0]];
        }
        swap([7, "seven"]); // ['seven', 7]
    }
    {
        function loggingIdentity(arg) {
            console.log(arg.length);
            return arg;
        }
        // Argument of type '{ name: number; }' is not assignable to parameter of type 'Lengthwise'.
        // loggingIdentity({ name: 8 });
        loggingIdentity({ length: 8 });
    }
    {
        // 泛型参数的默认类型 泛型类型 = 类型
        function createArray(length, value) {
            let result = [];
            for (let i = 0; i < length; i++) {
                result[i] = value;
            }
            return result;
        }
    }
}
